package cn.com.open.itembank.mapper;

import cn.com.open.itembank.entity.QuestionCategory;
import cn.com.open.itembank.sqlprovider.QuestionCategorySqlProvider;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * Created by lucky on 2017/7/31.
 */
@Mapper
public interface QuestionCategoryMapper {

    //region 获取单条试题应用类别信息

    /**
     * 根据试题应用类别id获取试题应用类别信息.
     *
     * @param id 试题应用类别id
     * @return 试题应用类别信息 by id
     */
    @Select("SELECT * FROM QuestionCategory WHERE QuestionCategoryID = #{id}")
    QuestionCategory getById(@Param("id") String id);

    /**
     * 根据试题应用类别id获取可用试题应用类别信息.
     *
     * @param id 试题应用类别id
     * @return 可用试题应用类别信息 enabled by id
     */
    @Select("SELECT * FROM QuestionCategory WHERE QuestionCategoryID = #{id} AND Status = 1")
    QuestionCategory getEnabledById(@Param("id") String id);

    /**
     * 根据试题应用类别名称获取可用试题应用类别信息.
     *
     * @param questionCategoryName 试题应用类别名称
     * @return 可用试题应用类别信息 enabled by name
     */
    @Select("SELECT * FROM QuestionCategory WHERE QuestionCategoryName = #{questionCategoryName} AND Status = 1")
    QuestionCategory getEnabledByName(@Param("questionCategoryName") String questionCategoryName);
    //endregion

    //region 获取各类集合信息

    /**
     * 获取试题应用类别名称信息
     *
     * @param name    试题应用类别名称
     * @param enabled 不为空字符串则表示只获取可用应用类别
     * @return the list
     */
    @SelectProvider(type = QuestionCategorySqlProvider.class, method = "getList")
    List<QuestionCategory> getList(@Param("name") String name, @Param("enabled") Boolean enabled);

    //endregion

    //region 判断是否重名

    /**
     * 修改时是否重名
     *
     * @param id                   试题应用类别id
     * @param questionCategoryName 试题应用类别名称
     * @return the chatper model
     */
    @Select("SELECT * FROM QuestionCategory WHERE QuestionCategoryName = #{questionCategoryName} AND QuestionCategoryID  <> #{id}")
    QuestionCategory isExistQuestionCategoryForUpdate(@Param("id") String id, @Param("questionCategoryName") String questionCategoryName);

    /**
     * 新增时是否重名
     *
     * @param questionCategoryName 试题应用类别名称
     * @return the chatper model
     */
    @Select("SELECT * FROM QuestionCategory WHERE QuestionCategoryName = #{questionCategoryName}")
    QuestionCategory isExistQuestionCategoryForInsert(@Param("questionCategoryName") String questionCategoryName);
    //endregion

    //region 新增修改删除试题应用类别信息

    /**
     * 新增试题应用类别信息.
     *
     * @param model 试题应用类别信息
     * @return the int
     */
    @Insert("INSERT INTO QuestionCategory (QuestionCategoryID,QuestionCategoryName,CreateTime,Status) VALUES (#{questionCategoryID},#{questionCategoryName},#{createTime},#{status})")
    int insert(QuestionCategory model);

    /**
     * 修改试题应用类别名称.
     *
     * @param id                   试题应用类别id
     * @param questionCategoryName 试题应用类别名称
     * @return the int
     */
    @Update("UPDATE QuestionCategory SET QuestionCategoryName=#{questionCategoryName} WHERE QuestionCategoryID=#{id}")
    int update(@Param("id") String id, @Param("questionCategoryName") String questionCategoryName);

    /**
     * 修改试题应用类别状态.
     *
     * @param id     试题应用类别id
     * @param status 试题应用类别新状态
     * @return the int
     */
    @Update("UPDATE QuestionCategory SET Status=#{status} WHERE QuestionCategoryID=#{id}")
    int changeStatus(@Param("id") String id, @Param("status") int status);

    /**
     * 删除试题应用类别信息.
     *
     * @param id 试题应用类别id
     * @return the int
     */
    @Delete("DELETE FROM QuestionCategory WHERE QuestionCategoryID=#{id}")
    int delete(@Param("id") String id);
    //endregion

    //region 根据试题应用类别ID获取各类相关资源数量，用于删除判断

    /**
     * 根据试题应用类别id获取试题类别关系数量.
     *
     * @param id 试题应用类别id
     * @return 关联试题数量 question count by category id
     */
    @Select("SELECT COUNT(*) FROM QuestionCategoryRelation WHERE QuestionCategoryID = #{id}")
    int getQuestionCountByCategoryId(@Param("id") String id);
    //endregion
}
